/**
 * HumanFactory.java
 * create by Lisq
 * date 2014-3-3
 */
package com.lsq.gong_chang_fang_fa_mo_shi;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @author Lisq
 */
@SuppressWarnings("all")
public class HumanFactory {
	//定义一个MAP,初始化过的Human对象都放在这里
	private static Map<String, Human> humans = new HashMap<String, Human>();

	public static Human createHuman(Class c) {
		Human human = null;
		try {
			//如果MAP中有，则直接从取出，不用初始化了
			if (humans.containsKey(c.getSimpleName())) {
				human = humans.get(c.getSimpleName());
			} else {
				human = (Human) Class.forName(c.getName()).newInstance();
				// 放到MAP中
				humans.put(c.getSimpleName(), human);
			}
		} catch (InstantiationException e) {
			System.out.println("必须指定人类的颜色");
		} catch (IllegalAccessException e) {
			System.out.println("人类定义错误！");
		} catch (ClassNotFoundException e) {
			System.out.println("混蛋，你指定的人类找不到！");
		}
		return human;
	}

	// 女娲生气了，把一团泥巴塞到八卦炉，哎产生啥人类就啥人类
	public static Human createHuman() {
		Human human = null; // 定义一个类型的人类
		// 首先是获得有多少个实现类，多少个人类
		List<Class> concreteHumanList = ClassUtils
				.getAllClassByInterface(Human.class); // 定义了多少人类
		// 八卦炉自己开始想烧出什么人就什么人
		Random random = new Random();
		int rand = random.nextInt(concreteHumanList.size());
		human = createHuman(concreteHumanList.get(rand));
		return human;
	}
}
